﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using SIM.Geo.BE;
using System.Linq;

namespace SIM.Geo.DA
{
    public class DALabor : Base
    {
        #region Metodos

        public List<Labor> Listar()
        {
            return this.Context.Labor.ToList();


        }

        /// <summary>
        /// Inserta labor
        /// </summary>
        /// <param name="labor"></param>
        /// <returns></returns>
        public int Insertar(Labor labor)
        {
            this.Context.Labor.AddObject(labor);
            this.Context.SaveChanges();
            return labor.CodigoLabor;

        }

        /// <summary>
        /// Modifica labor
        /// </summary>
        /// <param name="labor"></param>
        public void Modificar(Labor labor)
        {

            this.Context.Labor.Attach(labor);
            this.Context.ObjectStateManager.ChangeObjectState(labor, EntityState.Modified);
            this.Context.SaveChanges();

        }

        /// <summary>
        /// Elimina labor
        /// </summary>
        /// <param name="labor"></param>
        public void Eliminar(Labor labor)
        {

            this.Context.Labor.Attach(labor);
            this.Context.ObjectStateManager.ChangeObjectState(labor, EntityState.Deleted);
            this.Context.SaveChanges();

        }

        /// <summary>
        /// Busca labores
        /// </summary>
        /// <param name="nombre"></param>
        /// <returns></returns>
        public List<LaborResponse> Buscar(string nombre)
        {

            return this.Context.Labor.Where(x => x.NombreLabor.Contains(nombre))
                .Select(x => new LaborResponse
                {
                    CodigoLabor = x.CodigoLabor,
                    Nivel = x.Nivel,
                    CodigoZona = x.CodigoZona,
                    NombreZona = x.Zona.Descripcion,
                    CodigoCuerpo = x.CodigoCuerpo,
                    NombreCuerpo = x.Cuerpo.Nombre,
                    Seccion = x.Seccion,
                    NombreLabor = x.NombreLabor,
                    CodigoCategoriaLabor = x.CodigoCategoriaLabor,
                    NombreCategoriaLabor = x.CategoriaLabor.Descripcion,
                    CodigoTipoLabor = x.CodigoTipoLabor,
                    NombreTipoLabor = x.TipoLabor.Descripcion,
                    CodigoDireccion = x.CodigoDireccion,
                    NombreDireccion = x.DireccionLabor.Descripcion,
                    Cuadrante = x.Cuadrante
                }
                ).OrderBy(x => x.NombreLabor).ToList();

        }

        /// <summary>
        /// Busca labores
        /// </summary>
        /// <param name="nombre"></param>
        /// <returns></returns>
        public List<buscarLabor_Result> Buscar1(string nombre)
        {
            return this.Context.buscarLabor(nombre).ToList();
        }
        /// <summary>
        /// Obtiene por codigo
        /// </summary>
        /// <param name="codigoLabor"></param>
        /// <returns></returns>
        public Labor Obtener(int codigoLabor)
        {
            return this.Context.Labor.Where(x => x.CodigoLabor.Equals(codigoLabor)).FirstOrDefault();

        }

        /// <summary>
        /// Obtiene labor por Nombre y cuadrante
        /// </summary>
        /// <param name="nombreLabor"></param>
        /// <param name="cuadrante"></param>
        /// <returns></returns>
        public Labor ObtenerLaborPorNombreYCuadrante(string nombreLabor, int cuadrante)
        {
            return this.Context.Labor.Where(x => x.NombreLabor.ToUpper().Trim() == nombreLabor.ToUpper().Trim() && x.Cuadrante == cuadrante).FirstOrDefault();
        }
        /// <summary>
        /// Obtiene labor por Nombre
        /// </summary>
        /// <param name="nombreLabor"></param>
        /// <param name="cuadrante"></param>
        /// <returns></returns>
        public Labor ObtenerLaborPorNombre(string nombreLabor)
        {
            return this.Context.Labor.Where(x => x.NombreLabor.ToUpper().Trim() == nombreLabor.ToUpper().Trim()).FirstOrDefault();
        }
        #endregion
    }
}
